package cn.com.surker.sale.service;

import cn.com.surker.sale.entity.SaleContract;
import cn.com.surker.sale.entity.SaleContractSubsidy;
import cn.com.surker.spring.RestResultDto;
import cn.com.surker.system.entity.DataSourceInfo;
import cn.com.surker.system.entity.SysOrigin;
import cn.com.surker.vo.sale.SaleContractVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * @Author lucky
 * @create 2024年07月10 8:08
 * @desc
 */
public interface SaleContractBaseService extends IService<SaleContract> {

    /**
     * 分页查询
     * @param searchVal
     * @param workStatus 供应状态(2:已授权1:待授权3:终止)
     * @param quality 性质(1:正式2:待签合同,3:零星)
     * @param contractCategory 合同类型1:商砼，2：砂浆，3：水稳层，4：全轻混凝土，5：预制件合同)
     * @param projectCategory 工程类型(0:其他，1：地产类，2：厂房类，3：市政基础建设类)
     * @param billType 结算类型(0:月结，1：先款后货，2：垫资)
     * @param advanceType 垫资类型(-1:不垫资0:垫资方量，1：垫资金额，2：垫资天数)
     * @param workNature 供应性质(0：销售:1：内部代加工、2：外包代加工)
     * @param startTime
     * @param endTime
     * @param offset
     * @param limit
     * @return
     */
    IPage findPage(String searchVal, Long orgId, Integer workStatus, Integer quality, Integer contractCategory,
                   Integer projectCategory, Integer billType, Integer advanceType, Integer workNature,
                   Integer status, String startTime, String endTime, String sales, Integer offset, Integer limit);

	/**
	 * 分页查询合同与客户信息
	 * @param contract
	 * @param offset
	 * @param limit
	 * @return
	 */
    IPage findVoPage(SaleContract contract, Integer offset, Integer limit);

    /**
     * 根据公司查询销售人员
     * @param orgId
     * @return
     */
    List<Map<String, Object>> loadSales(Long orgId);

    /**
     * 查询所有合同
     * @param saleContract
     * @return
     */
    List<SaleContract> findAll(SaleContract saleContract);

    /**
     * 查询所有合同
     * @param saleContract
     * @return
     */
    List<SaleContractVo> findAllV1(SaleContract saleContract);

    /**
     * 保存合同
     * @param contract
     * @return 返回值如未带erpid或返回未空，则插入失败
     */
    RestResultDto saveContract(SaleContract contract);

    /**
     * 修改合同 除workStatus contractCategory不能修改，其他属性均可改变
     * @param contract
     * @return
     */
    RestResultDto updateContract(SaleContract contract);

    /**
     * 修改合同供应状态
     * @param workStatus 供应状态(2:已授权1:待授权3:终止)
     * @param contractId
     * @param creator
     * @return 次接口需验证权限，除信控专员与管理员，其他人员不得行直接操作
     */
	Integer updateWorkStatus(Integer workStatus, Long contractId, String creator);

	Integer updateWorkStatus2(Integer workStatus, Integer useType, Long contractId, String creator, String recordRemark);

    /**
     * 分页查询关停记录
     * @param orgId
     * @param conId
     * @param searchVal
     * @param sales
     * @param startTime
     * @param endTime
     * @param offset
     * @param limit
     * @return
     */
	Map<String, Object> findWorkStatusRecordPage(Long orgId, Long conId,String searchVal, String sales, String startTime,
                                                 String endTime, Integer offset, Integer limit);

    /**
     * 物理删除
     * @param status
     * @param contractId
     * @param creator
     * @return
     */
    Integer updateStatus(Integer status, Long contractId, Long creator);

	/**
	 * 根据erpid查询数据
	 *
	 * @param orgId
	 * @param erpId
	 * @return
	 */
	@Deprecated
	SaleContract findByErpId(Long orgId, Long erpId);

	@Deprecated
	SaleContract findByErpName(Long orgId, String erpConName);

    /**
     * 查询合同完成总量
     * @param contractId
	 * @param contractId
     * @return
     */
    Map<String, Object> queryContractRate(Long contractId);

	/**
	 * 查询合同
	 *
	 * @param conId
	 * @return
	 */
	SaleContractVo queryById(Long conId);

	/**
	 * 查询站点下的主合同列表
	 *
	 * @param orgId
	 * @return
	 */
	default List<Map<String, Object>> masterList(Long orgId) {
		return null;
	}

	/**
	 * 查询该合同下的从合同
	 *
	 * @param conId
	 * @return
	 */
	default List<SaleContract> slaveList(Long orgId, Long conId, Long slaveId) {
		return null;
	}

	/**
	 * 查询发票抬头
	 * @return
	 */
	List<SysOrigin> findReportUnit();

	List<SaleContract> queryConList(Long conId, Long orgId, Long clientId, String name, String code, Integer quality, Integer workStatus, Integer workNature, Integer contractCategory, String sales, String linkMan, String foreman);

	SaleContract queryCon(Long conId, Long orgId, Long clientId, String name, String code, Integer quality, Integer workStatus, Integer workNature, Integer contractCategory, String sales, String linkMan, String foreman);

	/**
	 * 查询不限供合同
	 * @param orgId
	 * @return
	 */
	List<SaleContract> findWorkByOrg(Long orgId);

	/**
	 * 根据公司id和类型查询合同
	 * @param orgId
	 * @param category
	 * @return
	 */
	List<SaleContract> findWorkByOrg(Long orgId, Integer category);
}
